<

プラットフォーム チャネル テスト インターフェイスの flutter_test パッケージへの移行

まとめ

次のメソッドは API に置き換えられました の中にflutter_testパッケージ:

  • BinaryMessenger.checkMessageHandler
  • BinaryMessenger.setMockMessageHandler
  • BinaryMessenger.checkMockMessageHandler
  • BasicMessageChannel.setMockMessageHandler
  • MethodChannel.checkMethodCallHandler
  • MethodChannel.setMockMethodCallHandler
  • MethodChannel.checkMockMethodCallHandler

onPlatformMessageコールバックは使用されなくなりました Flutter フレームワークによる。

コンテクスト

低レベルプラグインのリファクタリングの一環として 通信アーキテクチャから移行しました。 前onPlatformMessage/handlePlatformMessageに実装されたチャネルごとのバッファリング システムへのロジック のエンジンChannelBuffersクラス。 既存のコードとの互換性を維持するには、 既存のBinaryMessenger.setMessageHandlerAPI 新しいものを使用するようにリファクタリングされましたChannelBuffersAPI。

1つの違いは、ChannelBuffersAPIと 以前の API は、新しい API の方がより一貫性があります。 非同期性へのアプローチ。副作用として、 メッセージパッシング関連の API は完全に非同期になりました。

これにより、レガシーの実装に問題が生じました。 API をテストすることは、歴史的な理由により、 以前はflutterパッケージ。 これらは基礎となるロジックが部分的に同期していることに依存しているため、 リファクタリングが必要でした。 さらに多くのテスト ロジックを追加しないようにするため、flutterパッケージ、 このロジックをflutter_testパッケージ。

変更内容の説明

具体的には、次の API が影響を受けました。

  • BinaryMessenger.checkMessageHandler: 廃止。
  • BinaryMessenger.setMockMessageHandler: と取り換えるTestDefaultBinaryMessenger.setMockMessageHandler
  • BinaryMessenger.checkMockMessageHandler: 交換済み にTestDefaultBinaryMessenger.checkMockMessageHandler
  • BasicMessageChannel.setMockMessageHandler: 交換済み にTestDefaultBinaryMessenger.setMockDecodedMessageHandler
  • MethodChannel.checkMethodCallHandler: 廃止。
  • MethodChannel.setMockMethodCallHandler: と取り換えるTestDefaultBinaryMessenger.setMockMethodCallHandler
  • MethodChannel.checkMockMethodCallHandler: 交換済み にTestDefaultBinaryMessenger.checkMockMessageHandler

これらの置換は、 新しいTestDefaultBinaryMessengerBinding(使用するコードなど)testWidgetsflutter_testテスト)。 使用していた製品コードに代わるものはありません これらの API は実稼働コードでの使用を目的としていないためです。

を使用したテストcheckMessageHandlerに相当するものはありません メッセージ ハンドラーの登録が処理されるため、新しい API 直接的にChannelBuffersそうでないオブジェクト 現在登録されているチャンネルのリスナーを公開します。 (ハンドラーの登録を検証するテストはまれであるようです。)

移行が必要なコードでは、次のようなエラーが表示される場合があります。

  error - The method 'setMockMessageHandler' isn't defined for the type 'BinaryMessenger' at test/sensors_test.dart:64:8 - (undefined_method)

  error • The method 'setMockMethodCallHandler' isn't defined for the type 'MethodChannel' • test/widgets/editable_text_test.dart:5623:30 • undefined_method

[error] The method 'setMockMessageHandler' isn't defined for the type 'BasicMessageChannel' (test/material/feedback_test.dart:37:36)

加えてonPlatformMessage折り返し電話、 以前はフレームワークによってフックされていました プラグインからメッセージを受信します。現在は使用されていません (そしてやがて削除されます)。結果として、 このコールバックを呼び出してメッセージを フレームワークはもう効果がありません。

移行ガイド

flutter_testパッケージにはいくつかのシムが含まれているため、 時代遅れの用途setMock...checkMock...メソッドは引き続き機能します。 以前にインポートされなかったテストpackage:flutter_test/flutter_test.dartできる これらの shim を有効にするには、これを実行します。 ほとんどのコードを移行するにはこれで十分です。

ただし、これらの shim API は非推奨です。その代わり、 コード内で使用WidgetTester(たとえば、testWidgets)、 次のパターンを使用することをお勧めします。 それらのメソッドの呼び出しを置き換えます (どこtesterそれはWidgetTester実例):

// old code
ServicesBinding.defaultBinaryMessenger.setMockMessageHandler(...);
ServicesBinding.defaultBinaryMessenger.checkMockMessageHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockMessageHandler(...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(...);
// old code
myChannel.setMockMessageHandler(...);
myChannel.checkMockMessageHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockDecodedMessageHandler(myChannel, ...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(myChannel, ...);
// old code
myMethodChannel.setMockMethodCallHandler(...);
myMethodChannel.checkMockMethodCallHandler(...);
// new code
tester.binding.defaultBinaryMessenger.setMockMethodCallHandler(myMethodChannel, ...);
tester.binding.defaultBinaryMessenger.checkMockMessageHandler(myMethodChannel, ...);

を使用するテストpackage:testtest()使用するように変更できますpackage:flutter_testtestWidgets()にアクセスするにはWidgetTester

にアクセスできないコードWidgetTester参照できるTestDefaultBinaryMessengerBinding.instance!.defaultBinaryMessengerそれ以外のtester.binding.defaultBinaryMessenger

デフォルトのテスト ウィジェット バインディングを使用しないテスト (AutomatedTestWidgetsFlutterBinding、 によって初期化されますtestWidgets)を混合することができますTestDefaultBinaryMessengerBinding彼らの中に混ぜる 同じ結果を得るためにバインディングします。

操作するテストonPlatformMessageもうしないだろう 設計どおりに機能します。モックメッセージをフレームワークに送信するには、 使用を検討してくださいChannelBuffers.push。 プラグインからのメッセージを傍受するメカニズムはありません そしてそれらを新しい API のフレームワークに転送します。 あなたのユースケースでそのようなメカニズムが必要な場合は、バグを報告してください。

タイムライン

リリースされたバージョン: 2.3.0-17.0.pre.1
安定版リリース: 2.5

参考文献

API ドキュメント:

  • TestDefaultBinaryMessenger
  • TestDefaultBinaryMessengerBinding

関連する PR:

  • PR #76288: ChannelBuffers.push に移行する